package editor;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

/**
 * Clase principal del editor de niveles. 
 * @author Nehuen Antiman, Javier Amorosi.
 */
@SuppressWarnings("serial")
public class Editor extends javax.swing.JFrame {
	 
	private JMenuBar barra1;
	private JMenu menu1;
	private JMenuItem item1, item2;	
	private ButtonGroup grupo;
	private JRadioButton [] botones;	
	private String piso;	
	private JPanel panelBotones,panelMatriz, panel;
	private JScrollPane scrolBotones;
	private JLabel [][] matriz;
	private Matriz logica;
	private int filas ,columnas;

	/**
	* Método main del Editor de niveles. 
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Editor inst = new Editor(12,16);
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	/**
	 * Constructor de la clase Editor.
	 * @param f filas de la matriz que representa el mapa del juego. 
	 * @param c columnas de la matriz que representa el mapa del juego.
	 */
	public Editor(int f, int c) {		
		super("Editor de Niveles");
		
		//Set Look & Feel
		try {
			javax.swing.UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		setVisible(true);
		setResizable(false);
		setSize(1024, 650);
		setPreferredSize(new Dimension(1024, 650));
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		filas = f;
		columnas = c;
		logica = new Matriz(f,c);
		panel=(JPanel)getContentPane();
		panel.setLayout(null);
		initGUI();
		piso = "";
	}
	
	private void initGUI() {
		try {
			//se crea el panel 1 con etiqueta y se lo incerta
			panelBotones = new JPanel();
			panelBotones.setBackground(Color.white);
			panelBotones.setLayout(new GridLayout(26,1));
			JLabel	etiqueta = new JLabel("Elementos ubicables : ");
			panelBotones.add(etiqueta);
			
			scrolBotones=new JScrollPane();
			panel.add(scrolBotones);
			scrolBotones.setBounds(0, 0, 215, 600);
			scrolBotones.setViewportView(panelBotones);
			
			panelMatriz = new JPanel();
			panelMatriz.setLayout(new GridLayout(filas,columnas));
			panelMatriz.setBackground(Color.white);
			panel.add(panelMatriz);
			panelMatriz.setBounds(218, 1, 800, 600);
			panelMatriz.setSize(800, 600);
			panelMatriz.setPreferredSize(new java.awt.Dimension(800, 600));

			//se crea Matriz de etiquetas y se insertan en el panelMatriz 
			crearMatriz();
			//se crea Botones y se insertan en el panel 1
			crearBotones();
			
			panel.setPreferredSize(new Dimension(1024, 650));
	     	panel.setSize(1024, 650);
	     	panel.setBackground(new java.awt.Color(0,0,0));
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}

	private void crearMatriz(){
		//inicializa la matriz con asfalto por defecto y le agrega el oyente correspondiente.
		matriz = new JLabel[filas][columnas];
		ImageIcon aux = new ImageIcon(getClass().getResource("PisoAsfalto.png"));
		for(int i=0;i<filas;i++){
			for(int j=0;j<columnas;j++){
				matriz[i][j]= new JLabel();
				matriz[i][j].setIcon(aux);
				matriz[i][j].addMouseListener(new ManejadorEtiquetas(i,j));
				panelMatriz.add(matriz[i][j]);
			}
		}
	}
	
	private class ManejadorEtiquetas extends MouseAdapter{
		private int f,c;
		
		public ManejadorEtiquetas(int f,int c){
			this.f = f;
			this.c = c;
		}

		@Override
		public void mousePressed(MouseEvent arg0) {
			// setea la imagen del JLabel de acuerdo a el piso que este seleccionado.
			ImageIcon aux = null;			
			if(piso!=""){
				logica.cambiarPiso(f, c, piso);
				switch(piso){
					case "R": 					
						aux = new ImageIcon(getClass().getResource("PisoArena.png"));
					break;											
					case"A" :
						aux = new ImageIcon(getClass().getResource("PisoAsfalto.png"));
					break;						
					case "G" :
						aux = new ImageIcon(getClass().getResource("PisoAgua.jpg"));
					break;						
					case"F" :
						aux = new ImageIcon(getClass().getResource("PisoFuego.jpg"));
					break;							
					case"AE":
						aux = new ImageIcon(getClass().getResource("ObsPared.png"));
					break;						
					case"AJ":
						aux = new ImageIcon(getClass().getResource("ObsCaja.png"));
					break;												
					case"AP":
						aux = new ImageIcon(getClass().getResource("PremioPuntos.png"));
					break;				
					case"RE":
						aux = new ImageIcon(getClass().getResource("ObsPared.png"));
					break;						
					case"RJ":
						aux = new ImageIcon(getClass().getResource("ObsCaja.png"));
					break;												
					case"RP":
						aux = new ImageIcon(getClass().getResource("PremioPuntos.png"));
					break;								
					case"RL":
						aux = new ImageIcon(getClass().getResource("ObsPlanta.png"));
					break;					
					case"RT":
						aux = new ImageIcon(getClass().getResource("ArenaConcreto.jpg"));
					break;					
					case"AT":
						aux = new ImageIcon(getClass().getResource("AsfaltoConcreto.jpg"));
					break;					
					case"R@" :
						aux = new ImageIcon(getClass().getResource("ArenaFin.jpg"));
					break;					
					case"A@" :
						aux = new ImageIcon(getClass().getResource("AsfaltoFin.jpg"));
					break;					
					case "A#":
						aux = new ImageIcon(getClass().getResource("InicioAsfalto.jpg"));
					break;
					case"R#":
						aux = new ImageIcon(getClass().getResource("InicioArena.jpg"));
					break;					
					case"AO":
						aux = new ImageIcon(getClass().getResource("AsfaltoCono.jpg"));
					break;
					case"RO":
						aux = new ImageIcon(getClass().getResource("ArenaCono.jpg"));
					break;				
					case"AC":
						aux = new ImageIcon(getClass().getResource("AsfaltoCombustible.jpg"));
					break;
					case"RC":
						aux = new ImageIcon(getClass().getResource("ArenaCombustible.jpg"));
					break;					
					case"AB":
						aux = new ImageIcon(getClass().getResource("AsfaltoBala.jpg"));
					break;
					case"RB":
						aux = new ImageIcon(getClass().getResource("ArenaBala.jpg"));
					break;					
					case"RZ":
						aux = new ImageIcon(getClass().getResource("ArenaBaliza.jpg"));
					break;
					case"AZ":
						aux = new ImageIcon(getClass().getResource("AsfaltoBaliza.jpg"));
					break;				
				}
				matriz[f][c].setIcon(aux);		
			}			
		}
	}
	
	private void crearBotones(){
		barra1= new JMenuBar();
		setJMenuBar(barra1);

		menu1= new JMenu("Generar Mapa/Ayuda");
		barra1.add(menu1);

		item1= new JMenuItem("Generar Mapa");
		menu1.add(item1);
		item1.addActionListener(new oyenteMenu());

		item2= new JMenuItem("Ayuda");
		item2.addActionListener(new oyenteMenu());
		menu1.add(item2);

		//se define un nuevo JGropu:
		grupo = new ButtonGroup();
		botones = new JRadioButton[25];
		//se crean los botones.
		botones [0]= new JRadioButton("Arena");
		botones [1] = new JRadioButton("Asfalto");
		botones [2] = new JRadioButton("Agua");
		botones [3] = new JRadioButton("Fuego");
		botones [4] = new JRadioButton("Asfalto Balas");
		botones [5] = new JRadioButton("Asfalto Puntos");
		botones [6] = new JRadioButton("Asfalto Combustible");
		botones [7] = new JRadioButton("Asfalto Caja");
		botones [8] = new JRadioButton("Asfalto Pared");
		botones [9] = new JRadioButton("Asfalto Concreto");
		botones [10] = new JRadioButton("Asfalto Inicio");
		botones [11] = new JRadioButton("Asfalto Fin");
		botones [12] = new JRadioButton("Asfalto Cono");
		botones [13] = new JRadioButton("Asfalto Baliza");
		botones [14] = new JRadioButton("Arena Balas");
		botones [15] = new JRadioButton("Arena Puntos");
		botones [16] = new JRadioButton("Arena Combustible");
		botones [17] = new JRadioButton("Arena Planta");
		botones [18] = new JRadioButton("Arena Caja");
		botones [19] = new JRadioButton("Arena Pared");
		botones [20] = new JRadioButton("Arena Concreto");
		botones [21] = new JRadioButton("Arena Inicio");
		botones [22] = new JRadioButton("Arena Fin");
		botones [23] = new JRadioButton("Arena Cono");
		botones [24] = new JRadioButton("Arena Baliza");		
		//se agregan los botones botonGoup y al panel.
		for(int i=0;i<25;i++){
			panelBotones.add(botones[i]);
			scrolBotones.revalidate();
			grupo.add(botones[i]);
		}
		//se agrega el oyente a cada boton.
		botones [0].addItemListener(new ManejadorBoton("R"));
		botones [1].addItemListener(new ManejadorBoton("A"));
		botones [2].addItemListener(new ManejadorBoton("G"));
		botones [3].addItemListener(new ManejadorBoton("F"));
		botones [4].addItemListener(new ManejadorBoton("AB"));
		botones [5].addItemListener(new ManejadorBoton("AP"));
		botones [6].addItemListener(new ManejadorBoton("AC"));
		botones [7].addItemListener(new ManejadorBoton("AJ"));
		botones [8].addItemListener(new ManejadorBoton("AE"));
		botones [9].addItemListener(new ManejadorBoton("AT"));
		botones [10].addItemListener(new ManejadorBoton("A@"));
		botones [11].addItemListener(new ManejadorBoton("A#"));
		botones [12].addItemListener(new ManejadorBoton("AO"));
		botones [13].addItemListener(new ManejadorBoton("AZ"));
		botones [14].addItemListener(new ManejadorBoton("RB"));
		botones [15].addItemListener(new ManejadorBoton("RP"));
		botones [16].addItemListener(new ManejadorBoton("RC"));
		botones [17].addItemListener(new ManejadorBoton("RL"));
		botones [18].addItemListener(new ManejadorBoton("RJ"));
		botones [19].addItemListener(new ManejadorBoton("RE"));
		botones [20].addItemListener(new ManejadorBoton("RT"));
		botones [21].addItemListener(new ManejadorBoton("R@"));
		botones [22].addItemListener(new ManejadorBoton("R#"));
		botones [23].addItemListener(new ManejadorBoton("RO"));	
		botones [24].addItemListener(new ManejadorBoton("RZ"));
	}
		
	private class ManejadorBoton implements ItemListener{		
		private String aux;		
		public ManejadorBoton(String c)	{
			aux = c;			
		}
		@Override
		public void itemStateChanged(ItemEvent e) {
			// ahora el piso se correspondera con la cadena del RadioButton seleccionada.
			piso = aux;
		}		
	}
	
	private class oyenteMenu implements ActionListener{		
		@Override
		public void actionPerformed(ActionEvent arg0) {
			if(arg0.getSource()==item2)
				JOptionPane.showMessageDialog(null,
						"Seleccione el piso a insertar en los botones a su izquierda \n" +
						"luego haga click sobre los pisos de la derecha para insertarlos \n"+
						"tenga en cuenta que un nivel bien generado tiene uno y solo uno piso de inicio y de final."	);				
			if (arg0.getSource()==item1){
				Escritora nueva;
				String aux = logica.retornarCadena();
				if (aux != null){
					String nombre = JOptionPane.showInputDialog("Ingrese el nombre del nuevo mapa :");				
					nueva = new Escritora(nombre);
					nueva.Escribir(aux);
					JOptionPane.showMessageDialog(null, "Nivel generado exitosamente.");					
			}else
				JOptionPane.showMessageDialog(null, "Se produjo un error, asegurese de haber ingresado un punto de incio y un punto de fin,vuelva a intentarlo.");			
			}					
		}		
	}

}
